#include "VistaNavegador.h"
#include "VentanaDiseniador.h"
#include <cstdlib>

VistaNavegador::VistaNavegador() {
	refTreeModel = Gtk::TreeStore::create(columnas);
	set_model(refTreeModel);
	fila_mundo = *(refTreeModel->append());
	fila_mundo[columnas.columna_id] = 0;
	fila_mundo[columnas.columna_nombre] = "(Mundo sin nombre)";
	agregarNivel(1);
	append_column("ID", columnas.columna_id);
	append_column("Nombre", columnas.columna_nombre);
	expand_all();
	get_selection()->select(fila_nivel_activa);
	signal_row_activated().connect(sigc::mem_fun(*this,
			&VistaNavegador::on_treeview_row_activated));
}

void VistaNavegador::on_name_mundo_changed(const Glib::ustring &nombre) {
	fila_mundo[columnas.columna_nombre] = nombre;
}

void VistaNavegador::agregarNivel(unsigned id) {
	fila_nivel_activa = *(refTreeModel->append(fila_mundo.children()));
	fila_nivel_activa[columnas.columna_id] = id;
	char buffer[10];
	sprintf(buffer, "Nivel %d", id);
	fila_nivel_activa[columnas.columna_nombre] = buffer;
	get_selection()->select(fila_nivel_activa);
}

void VistaNavegador::quitarNivel() {
	Gtk::TreeModel::iterator iter = refTreeModel->erase(fila_nivel_activa);

	/* Decremento el id de los niveles que le siguen al eliminado */
	Gtk::TreeModel::Row row;
	unsigned idNuevo;
	char buffer[10];
	while (iter) {
		row = *iter;
		idNuevo = row[columnas.columna_id] - 1;
		row[columnas.columna_id] = idNuevo;
		sprintf(buffer, "Nivel %d", idNuevo);
		row[columnas.columna_nombre] = buffer;
		++iter;
	}
	iter = refTreeModel->children().begin()->children().begin();

	/* Si encuentra la fila del primer nivel, se selecciona esa vista */
	if (iter) {
		fila_nivel_activa = *iter;
	}
	/* Si no se encuentra, quiere decir que el nivel eliminado era el unico en
	 * en mundo, por lo que se agrega una fila de un nivel ya que el diseñador
	 * al eliminar el ultimo nivel en el mundo, crea un nuevo nivel
	 * automaticamente para tener siempre un nivel en el mundo */
	else {
		agregarNivel(1);
		expand_all();
	}
	get_selection()->select(fila_nivel_activa);
}

void VistaNavegador::on_treeview_row_activated(const Gtk::TreeModel::Path& path,
		Gtk::TreeViewColumn* /* columna */) {
	Gtk::TreeModel::iterator iter = refTreeModel->get_iter(path);
	if (iter) {
		Gtk::TreeModel::Row row = *iter;
		unsigned idNivel = row[columnas.columna_id];

		/* No se selecciono la fila de mundo*/
		if (idNivel != 0) {
			VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
					get_toplevel());

			bool cambio = ventana->getPropiedadesMundoActual(
					)->cambiarNivelActual(idNivel);

			if (cambio) {
				ventana->actualizarVistaPropiedadesNivel();
				fila_nivel_activa = row;
			}
		}
	}
}

VistaNavegador::~VistaNavegador() { }